package apierror

import (
	"bytes"
	"github.com/vektah/gqlparser/v2/gqlerror"
)

//graphql 错误包装
type Error struct {
	// 原错误
	err error `json:"-"`
	//错误原因的简单语言描述。
	Message string `json:"msg"`
	//错误代码，采用小写错误关键词加下划线构成。
	Code string `json:"code"`
}

type List []*Error

func (err *Error) Error() string {
	var res bytes.Buffer
	if err == nil {
		return ""
	}

	res.WriteString(err.Code)
	res.WriteString(": ")
	res.WriteString(err.Message)
	return res.String()
}

func (err Error) Unwrap() error {
	return err.err
}

func (errs List) Error() string {
	var buf bytes.Buffer
	for _, err := range errs {
		buf.WriteString(err.Error())
		buf.WriteByte('\n')
	}
	return buf.String()
}

// 把gqlgen框架的错误结构转换成自定义的错误结构
func FromGraphqlErrorList(list gqlerror.List) List {
	if list == nil {
		return nil
	}
	errs := make([]*Error, len(list))
	for _, v := range list {
		err := v.Unwrap()
		// api异常
		if apiError, ok := err.(IApiError); ok {

			errs = append(errs, &Error{
				err:     err,
				Message: apiError.GetMsg(),
				Code:    apiError.GetCode(),
			})
			continue
		}
		// 其他异常
		errs = append(errs, &Error{
			err:     err,
			Message: err.Error(),
		})
	}
	return errs
}
